import socket
import mission 
import kociemba
import time
hardware_plan = []

def surfaces_2_plan(surfaces):
    global hardware_plan
    trans_ref = 'LUFRDB' #基准坐标面
    trans_table = { #面转换表，当转了一面以后，之前要转的面在现在魔方状态下已经换了个坐标（UFL等字母表示坐标），所以每转一次，后面的所以转的指令都得变
            'U1':'FURBDL',#90
            'U2':'RUBLDF',#
            'U3':'BULFDR',
            'L1':'LBURFD',
            'L2':'LDBRUF',
            'L3':'LFDRBU',
            'F1':'LFDRBU',
            'F2':'LFDRBU',
            'F3':'LFDRBU',
            'D1':'LUFRDB',
            'D2':'LUFRDB',
            'D3':'LUFRDB',
            'R1':'LUFRDB',
            'R2':'LUFRDB',
            'R3':'LUFRDB',
            'B1':'BULFDR',
            'B2':'BULFDR',
            'B3':'BULFDR'} 
    init_trans = 'RBDLFU' #scan以后坐标面的变化
    hardware_plan = []
    plan = []
    socket_input_string = ''
    for i in range(6):
        for j in range(9):
            socket_input_string += surfaces[i][j]
    #  *1表示顺时针旋转90，*2表示旋转180，*3表示逆时针旋转90
    #  *表示顺时针旋转90，*2表示旋转180，*‘表示逆时针旋转90
    time_begin = time.time()
    try:
        kociemba1 = kociemba.solve(socket_input_string,'UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB')
        print('初始状态'+str(socket_input_string))
        # print('解算步骤'+str（kociemba1))
        kociemba1 += ' '
        kociemba_receieve = ''
        solve_num = 0
        for i in range(len(kociemba1)):
            if ( kociemba1[i] != ' '):
                if ( kociemba1[i] == 'R' or kociemba1[i] == 'U' or kociemba1[i] == 'D' or kociemba1[i] == 'B' or kociemba1[i] == 'F' or kociemba1[i] == 'L'):
                    kociemba_receieve += kociemba1[i]
                    if ( kociemba1[i+1] == ' '):
                        kociemba_receieve += '1'
                elif ( kociemba1[i] == '\''):
                    kociemba_receieve += '3'
                elif ( kociemba1[i] == '2'):
                    kociemba_receieve += kociemba1[i]
            elif ( kociemba1[i] == ' '):
                kociemba_receieve += ' '
                solve_num += 1
        kociemba_receieve += '('
        kociemba_receieve += 'f'
        kociemba_receieve += ')'
        print('解算步骤'+str(kociemba_receieve))
        print('The number of kociemba way is:'+str(solve_num))
    except Exception as error:
        kociemba_receieve = ''
        print('kociemba err')
        mission.add(['Finished2'])
        return False
    print('solve time = %5.3f s'%(time.time()-time_begin))
    words = kociemba_receieve.split(' ')
        
    if words[-1][-2] != 'f':
        print('Server process Error...')
        return False
    else:
        print('Server process Success!')
        for word in words[0:-1]:
            plan.append([word[0], word[1]])
        trans = ''
        for i in range(len(plan)):#从第一个指令开始，后面以此坐标变换
            for j in range(6):
                if plan[i][0] == trans_ref[j]:
                    plan[i][0] = init_trans[j]
                    break
        for i in range(len(plan)):
            trans = trans_table[plan[i][0] + plan[i][1]]
            for j in range(len(plan)):
                if j > i:
                    for k in range(len(trans)):
                        if plan[j][0] == trans_ref[k]:
                            plan[j][0] = trans[k]
                            break
        plan_string = []
        for item in plan:
            plan_string.append(item[0] + item[1])
        mission.add(plan_string+['Finished'])
    # plan_string.append('F1')
    # mission.add(plan_string)
    #print(plan_string)
    return socket_input_string

def surfaces_3_plan(surfaces, object_surface):
    global hardware_plan

    trans_ref = 'LUFRDB' #基准坐标面
    trans_table = { #面转换表，当转了一面以后，之前要转的面在现在魔方状态下已经换了个坐标（UFL等字母表示坐标），所以每转一次，后面的所以转的指令都得变
            'U1':'FURBDL',#90
            'U2':'RUBLDF',#
            'U3':'BULFDR',
            'L1':'LBURFD',
            'L2':'LDBRUF',
            'L3':'LFDRBU',
            'F1':'LFDRBU',
            'F2':'LFDRBU',
            'F3':'LFDRBU',
            'D1':'LUFRDB',
            'D2':'LUFRDB',
            'D3':'LUFRDB',
            'R1':'LUFRDB',
            'R2':'LUFRDB',
            'R3':'LUFRDB',
            'B1':'BULFDR',
            'B2':'BULFDR',
            'B3':'BULFDR'} 
    init_trans = 'RBDLFU' #scan以后坐标面的变化
    hardware_plan = []

    plan = []
    socket_input_string = ''
    for i in range(6):
        for j in range(9):
            socket_input_string += surfaces[i][j]
    #  *1表示顺时针旋转90，*2表示旋转180，*3表示逆时针旋转90
    #  *表示顺时针旋转90，*2表示旋转180，*‘表示逆时针旋转90
    time_begin = time.time()
    real_object_surface = ''
    # for face in object_surface:
    #     real_object_surface += dict[face]
    try:
        kociemba1 = kociemba.solve(socket_input_string,object_surface)
        print('当前状态'+str(socket_input_string))
        print('期望状态'+str(object_surface))
        kociemba1 += ' '
        kociemba_receieve = ''
        solve_num = 0
        for i in range(len(kociemba1)):
            if ( kociemba1[i] != ' '):
                if ( kociemba1[i] == 'R' or kociemba1[i] == 'U' or kociemba1[i] == 'D' or kociemba1[i] == 'B' or kociemba1[i] == 'F' or kociemba1[i] == 'L'):
                    kociemba_receieve += kociemba1[i]
                    if ( kociemba1[i+1] == ' '):
                        kociemba_receieve += '1'
                elif ( kociemba1[i] == '\''):
                    kociemba_receieve += '3'
                elif ( kociemba1[i] == '2'):
                    kociemba_receieve += kociemba1[i]
            elif ( kociemba1[i] == ' '):
                kociemba_receieve += ' '
                solve_num += 1
        kociemba_receieve += '('
        kociemba_receieve += 'f'
        kociemba_receieve += ')'
        print('解算步骤'+str(kociemba_receieve))
        print('The number of kociemba way is:'+str(solve_num))
    except Exception as error:
        kociemba_receieve = ''
        print('kociemba err')
        mission.add(['Finished2'])
        return False

    print('solve time = %5.3f s'%(time.time()-time_begin))
    words = kociemba_receieve.split(' ')
        
    if words[-1][-2] != 'f':
        print('Server process Error...')
        return False
    else:
        print('Server process Success!')
        for word in words[0:-1]:
            plan.append([word[0], word[1]])
        trans = ''
        for i in range(len(plan)):#从第一个指令开始，后面以此坐标变换
            for j in range(6):
                if plan[i][0] == trans_ref[j]:
                    plan[i][0] = init_trans[j]
                    break
        for i in range(len(plan)):
            trans = trans_table[plan[i][0] + plan[i][1]]
            for j in range(len(plan)):
                if j > i:
                    for k in range(len(trans)):
                        if plan[j][0] == trans_ref[k]:
                            plan[j][0] = trans[k]
                            break
        plan_string = []
        for item in plan:
            plan_string.append(item[0] + item[1])
        mission.add(plan_string+['Finished1'])
    # plan_string.append('F1')
    # mission.add(plan_string)
    #print(plan_string)
